package org.fastsyncer.parser.webservice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.fastsyncer.common.entity.Mapping;
import org.fastsyncer.common.entity.MappingTask;
import org.fastsyncer.common.entity.WebServiceConfig;
import org.fastsyncer.common.util.JsonUtil;
import org.fastsyncer.connector.ws.WebServiceConnector;
import org.fastsyncer.parser.util.ConvertUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WebserviceParser {

	// 实现单例模式的方法，通过方法来实现实例化
	// 声明一个私有的静态属性，使只被实例化一次
	private static final WebserviceParser instance = new WebserviceParser();

	// 声明一个私有的构造方法，使别人不能随便new对象
	// 它只被调用一次，实例存在之后就不再调用了
	private WebserviceParser() {
	}

	// 声明一个公共的静态方法，外界通过调用这个方法来得到唯一的实例
	public static WebserviceParser getInstance() {
		return instance;
	}

	private static Logger logger = LoggerFactory.getLogger(WebserviceParser.class);

	/**
	 * 推送目标源
	 * 
	 * @param mappingTask
	 * @param before
	 *            同步数据
	 * @param after
	 *            同步数据
	 * @return 执行结果true/false
	 * @throws Exception
	 */
	public boolean send(MappingTask mappingTask, JSONArray before, JSONArray after) throws Exception {
		// 1.解析数据源,从msg中匹配数据源中的字段
		JSONArray msg = before.length() > 0 ? before : after;
		logger.info("转换前:" + msg.toString());

		// 同步数据源、目标源属性
		Mapping sourceMapping = mappingTask.getSourceMapping();
		Mapping targetMapping = mappingTask.getTargetMapping();
		List<HashMap<String, Object>> sourceFileds = sourceMapping.getFileds();
		List<HashMap<String, Object>> targetFileds = targetMapping.getFileds();
		Map<String, Object> map = new HashMap<String, Object>();

		// 2.将数据源中的字段转换为目标源字段
		// 数据总条数
		int len = msg.length();
		int size = sourceFileds.size();
		for (int i = 0; i < size; i++) {
			String sName = (String) sourceFileds.get(i).get("name");

			// 匹配同步数据中相似的字段
			for (int j = 0; j < len; j++) {
				JSONObject f = msg.getJSONObject(j);
				if (StringUtils.equals(sName, f.getString("name"))) {
					// 获取数据源映射的目标源字段
					String tName = (String) targetFileds.get(i).get("name");
					map.put(tName, f.getString("value"));
					break;
				}
			}
		}

		// 3.检查转换后的数据是否为空
		if (map.isEmpty()) {
			throw new Exception("同步失败:无法匹配属性,请检查数据源中是否存在该映射关系!");
		}

		// 4.对数据进行转换处理
		ConvertUtil.convert(targetMapping, map);

		// 5.转换为JSON字符串
		String objToJson = JsonUtil.objToJson(map);
		logger.info("转换后:" + objToJson);

		// 6.推送目标源
		WebServiceConfig config = (WebServiceConfig) targetMapping.getConfig();
		Object r = WebServiceConnector.getInstance().send(config.getUrl(), config.getMethod(), objToJson);
		logger.info(r.toString());
		return true;
	}

}
